const fs = require('fs');
const {exec} = require('child_process');
const {promisify} = require('util');
const execAsync = promisify(exec);
const path = require('path');

// 服务器配置
const serverConfig = {
  host: '114.55.0.234', // 服务器地址
  username: 'root', // 用户名
  remotePath: '/usr/local/tsun/web/tsc/private', // 远程服务器目标路径
};

// SSH免登配置，不需要expect脚本

// 检查文件是否存在
function checkFileExists(filePath) {
  if (!fs.existsSync(filePath)) {
    throw new Error(`文件不存在: ${filePath}`);
  }
}

// 删除文件
function deleteFile(filePath) {
  try {
    if (fs.existsSync(filePath)) {
      fs.unlinkSync(filePath);
      console.log(`🗑️ 已删除文件: ${filePath}`);
    }
  } catch (error) {
    console.error(`❌ 删除文件失败 ${filePath}:`, error);
  }
}

async function deploy() {
  const generatedFiles = [];
  try {
    const currentDir = process.cwd();

    // 1. 生成update.json文件
    const updateJson = {
      version: '1.0.2.1',
      downloadIosUrl:
        'https://test-monitoring.tsun-ess.com/private/main.jsbundle.zip',
      downloadAndroidUrl:
        'https://test-monitoring.tsun-ess.com/private/index.android.bundle.zip',
    };

    const updateJsonPath = path.join(currentDir, 'update.json');
    fs.writeFileSync(updateJsonPath, JSON.stringify(updateJson, null, 4));
    generatedFiles.push(updateJsonPath);
    console.log('✅ update.json文件生成成功');

    // 2. 执行npm export-ios打包构建
    console.log('🚀 开始执行打包构建...');
    await execAsync('npm run export-ios');
    await execAsync('npm run export-android');
    console.log('✅ 打包构建完成');

    // 检查bundle文件是否存在
    const bundlePath = path.join(currentDir, 'ios/main.jsbundle.zip');
    const androidBundlePath = path.join(
      currentDir,
      'android/index.android.bundle.zip',
    );
    checkFileExists(bundlePath);
    checkFileExists(androidBundlePath);
    console.log('✅ 找到bundle文件:', bundlePath);
    console.log('✅ 找到bundle文件:', androidBundlePath);
    generatedFiles.push(bundlePath, androidBundlePath);

    // 3. 删除服务器上的旧文件
    const localFiles = [updateJsonPath, bundlePath, androidBundlePath];
    const remoteFiles = [
      'update.json',
      'main.jsbundle.zip',
      'index.android.bundle.zip',
    ];
    // 4. 通过scp传输新文件到远程服务器
    console.log('📤 开始传输新文件...');
    for (let i = 0; i < localFiles.length; i++) {
      const scpCommand = `scp ${localFiles[i]} ${serverConfig.username}@${serverConfig.host}:${serverConfig.remotePath}/${remoteFiles[i]}`;
      await execAsync(scpCommand);
      console.log(`✅ ${localFiles[i]} 传输完成`);
    }

    // 5. 修改文件权限
    console.log('🔒 正在修改文件权限...');
    const chownCommand = `ssh ${serverConfig.username}@${
      serverConfig.host
    } "chown nginx:nginx ${serverConfig.remotePath}/${remoteFiles.join(
      ` ${serverConfig.remotePath}/`,
    )}"`;
    await execAsync(chownCommand);
    console.log('✅ 文件权限修改完成');

    console.log('🎉 部署完成！');
  } catch (error) {
    console.error('❌ 部署过程中发生错误:', error);
    process.exit(1);
  } finally {
    // 清理生成的文件
    console.log('🧹 开始清理生成的文件...');
    generatedFiles.forEach(file => deleteFile(file));
    console.log('✅ 文件清理完成');
  }
}

deploy();
